#include <bits/stdc++.h>
using namespace std;
const int N=1e3+50;
const int M=2e3+50;
int n,s,k,u,v;
int fa[N],ind[N];
bool cov[N];
//保存大于k的每一个深度对应的节点
vector<int> nodes[N];
struct Edge{
    int v,next;
}edge[M];
int cnt,head[N];
void init(){
    cnt=0;
    memset(head,-1,sizeof(head));
}
void addEdge(int u,int v){
    edge[cnt]=Edge{v,head[u]};
    head[u]=cnt++;
    edge[cnt]=Edge{u,head[v]};
    head[v]=cnt++;
}
//无根树转有根树,并根据深度将叶子节点插入node表
void dfs(int u,int f,int d){
    fa[u]=f;
    if(ind[u]==1 && d>k){
        nodes[d].push_back(u);
    }
    for(int i=head[u];i!=-1;i=edge[i].next){
        int v=edge[i].v;
        if(v==f){
            continue;
        }
        dfs(v,u,d+1);
    }
}
void dfs2(int u,int f,int d){
    cov[u]=true;
    for(int i=head[u];i!=-1;i=edge[i].next){
        int v=edge[i].v;
        //只能覆盖离服务器k的节点
        if(v==f || d>=k){
            continue;
        }
        dfs2(v,u,d+1);
    }
}
int solve(){
    int ans=0;
    memset(cov,false,sizeof(cov));
    for(int d=n-1;d>k;d--){
        int sz=nodes[d].size();
        for(int i=0;i<sz;i++){
            int u=nodes[d][i];
            //已覆盖
            if(cov[u]){
                continue;
            }
            int v=u;
            //向上延伸到k级祖先
            for(int j=0;j<k;j++){
                v=fa[v];
            }
            dfs2(v,-1,0);
            //放置服务器
            ans++;
        }
    }
    return ans;
}
int main(void){
    int t;
    scanf("%d",&t);
    while(t--){
        memset(ind,0,sizeof(ind));
        scanf("%d%d%d",&n,&s,&k);
        init();
        for(int i=1;i<=n;i++){
            nodes[i].clear();
        }
        for(int i=0;i<n-1;i++){
            scanf("%d%d",&u,&v);
            addEdge(u,v);
            ind[u]++;
            ind[v]++;
        }
        dfs(s,-1,0);
        int ans=solve();
        printf("%d\n",ans);
    }
    return 0;
}